import java.util.*;

public class day6 {
    /**
     * 多状态线性dp
     * mari和shiny
     * https://ac.nowcoder.com/acm/problem/26226
     */
    public static void main(String[] args) {
        /**
         * 空间优化
         */
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        char[] str = in.next().toCharArray();
        long s = 0; // s表示：到达i位置后，0~i区间中的‘s’的所有个数
        long h = 0; // h表示：到达i位置后，0~i区间中的‘sh’的所有个数
        long y = 0; // y表示：到达i位置后，0~i区间中的‘shy’的所有个数
        // 初始化
        for(int i = 0;i < n;i++) {
            if(str[i] == 's') {
                s++;
            }else if(str[i] == 'h') {
                h += s;
            }else if(str[i] == 'y') {
                y += h;
            }
        }
        System.out.print(y);
    }
    public static void main2(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        String str = in.next();
        long[] s = new long[n]; // s[i]表示：到达i位置后，0~i区间中的‘s’的所有个数
        long[] h = new long[n]; // h[i]表示：到达i位置后，0~i区间中的‘sh’的所有个数
        long[] y = new long[n]; // y[i]表示：到达i位置后，0~i区间中的‘shy’的所有个数
        // 初始化
        s[0] = str.charAt(0) == 's' ? 1 : 0;
        h[0] = y[0] = 0; // 它们表示的字符长度是超过1的
        for(int i = 1;i < n;i++) {
            s[i] = s[i - 1];
            if(str.charAt(i) == 's') {
                s[i]++;
            }
            h[i] = h[i - 1];
            if(str.charAt(i) == 'h') {
                // 在0~i-1 区间内找，当以这个位置的h为结尾的‘sh’的话在前面找有多少个‘s’，负责就在前面找多少个‘sh'
                h[i] += s[i - 1];
            }
            y[i] = y[i - 1];
            if(str.charAt(i) == 'y') {
                // 和上面的 h[i]是一致的
                y[i] += h[i - 1];
            }
        }
        System.out.print(y[n - 1]);
    }


    /**
     * 双指针
     * JZ52 两个链表的第一个公共结点
     * https://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?tpId=13&tqId=11189&ru=/exam/oj
     */
    public class ListNode {
        int val;
        ListNode next = null;

        ListNode(int val) {
            this.val = val;
        }
    }
    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
        ListNode cur1 = pHead1;
        ListNode cur2 = pHead2;
        while(cur1 != cur2) {
            // 当他俩没有共同点的时候，在第二次进行遍历的时候呢，会都等于null，直接返回即可
            cur1 = cur1 != null ? cur1.next : pHead2;
            cur2 = cur2 != null ? cur2.next : pHead1;
        }
        return cur1;
    }

    /**
     * 模拟
     * OR63 删除公共字符
     * https://www.nowcoder.com/practice/f0db4c36573d459cae44ac90b90c6212?tpId=182&tqId=34789&ru=/exam/oj
     */
    public static void main1(String[] args) {
        Scanner in = new Scanner(System.in);
        String str1 = in.nextLine();
        String str2 = in.nextLine();

        Set<Character> hash = new HashSet<>();
        for(int i = 0;i < str2.length();i++) {
            hash.add(str2.charAt(i));
        }

        for(int i = 0;i < str1.length();i++) {
            if(!hash.contains(str1.charAt(i))) {
                System.out.print(str1.charAt(i));
            }
        }
    }
}
